/**
 * @(#)EstructuraSalarialK.java Feb 20, 2007
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : Psique
 * <br/>Creaci&oacute;n: Feb 20, 2007 - 1:25:21 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>Feb 20, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Creaci&oacute;n del Objeto.</li>
 * <li>Abr 19, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Se eliminar&oacute;n las referencias a las clases Empresa, Deportamento, etc y se cambiar&oacute;n por referencias a Estructura.</li>
 *
 * </ul>
 */

package com.psiqueware.jazmin.empresas.recursos.humanos.compensaciones.modelo;


import com.psiqueware.alheli.basico.BaseObject;
import com.psiqueware.jazmin.empresas.recursos.humanos.compensaciones.GradoRangoSalarial;
import com.psiqueware.jazmin.empresas.recursos.humanos.compensaciones.EstructuraSalarial;
import com.psiqueware.manzanilla.informacion.documentos.Documento;
import com.psiqueware.tulipan.organizacional.Estructura;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Conjunto de {@link RangoSalarial}es para definir la forma de pago de diferentes {@link Empleado}s con una funci&oacute;n determinada.
 * <br/>Paquete Original: com.psiqueware.laVIE.empresas.empleados.compensaciones.modelo
 * <br/>Nombre  Original: EstructuraSalarialK
 * <br/>Oprima para ver : <a href="EstructuraSalarialK.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Psique</a>
 * @version Revision: 1.1 Feb 20, 2007 1:25:21 PM
 * @noinspection ClassWithoutLogger
 */
public class EstructuraSalarialK extends BaseObject implements EstructuraSalarial
{

    /** Clave de esta {@link EstructuraSalarial}. */
    private String m_clave;


    /** Descripci&oacute;n de la {@link EstructuraSalarial}. */
    private Documento m_descripcion;


    /** Listado de {@link GradoRangoSalarial}s que son v&aacute;lidos para esta EstructuraSalarial. */
    private List<GradoRangoSalarial> m_grados = new ArrayList<GradoRangoSalarial> ( );

    /** Identificador &uacute;nico de la {@link Estructura} a la que pertenece esta {@link EstructuraSalarial}. */
    private Long m_idEstructura;

    /** Constructor de EstructuraSalarialK. */
    public EstructuraSalarialK ()
    {

    }

    /**
     * Constructor de EstructuraSalarialK.
     *
     * @param clave para diferenciar la {@link EstructuraSalarial}.
     */
    public EstructuraSalarialK ( final Estructura estructura, final String clave )
    {
        m_clave = clave;
        m_idEstructura = estructura.getId ();
    }


    /**
     * A&ntilde;ade un GradoRangoSalarial al listado m_grados, que son v&aacute;lidos para esta EstructuraSalarial.
     *
     * @param o {@link GradoRangoSalarial} a a&ntilde;adir.
     *
     * @return <tt>true</tt> (as per the general contract of the
     *         <tt>Collection.add</tt> method).
     */
    public boolean addGradoRangoSalarial ( GradoRangoSalarial o )
    {
        if ( null == m_grados )
        {
            m_grados = new ArrayList<GradoRangoSalarial> ();
        }
        return m_grados.add ( o );
    }

    /**
     * Remueve un {@link GradoRangoSalarial} del listado {@link m_grados}, que son v&aacute;lidos para esta EstructuraSalarial.
     *
     * @param o {@link GradoRangoSalarial} a eliminar.
     *
     * @return <tt>true</tt> if this list contained the specified element.
     */
    public boolean removeGradoRangoSalarial ( GradoRangoSalarial o )
    {
        boolean salida = false;
        if ( null != m_grados )
        {
            salida = m_grados.remove ( o );
        }
        return salida;

    }

    /**
     * Devuelve una copia del listado {@link m_grados}, que son v&aacute;lidos para esta EstructuraSalarial.
     *
     * @return un nuevo ArrayList<GradoRangoSalarial>.
     */
    public List<GradoRangoSalarial> listGradoRangoSalariales ()
    {
        List<GradoRangoSalarial> salida = null;
        if ( m_grados != null )
        {
            salida = new ArrayList<GradoRangoSalarial> ( m_grados );
        }
        return salida;
    }

    /**
     * Devuelve la Lista de los {@link GradoRangoSalarial} que son v&aacute;lidos para esta EstructuraSalarial.
     *
     * @return List(unmodifiable) de 'm_grados'. <code>null</code> en caso de no existir.
     *
     * @see java.util.List
     */
    public List<GradoRangoSalarial> getGradoRangoSalariales ()
    {
        List<GradoRangoSalarial> salida = null;
        if ( null != m_grados )
        {
            salida = Collections.unmodifiableList ( m_grados );
        }
        return salida;
    }

    /**
     * Establece la Lista de los {@link GradoRangoSalarial} que son v&aacute;lidos para esta EstructuraSalarial.
     *
     * @param newList nuevo valor para 'm_grados'.
     *
     * @noinspection AssignmentToNull
     * @see java.util.List
     */
    public void setGradoRangoSalarials ( List<? extends GradoRangoSalarial> newList )
    {
        if ( null == newList )
        {
            this.m_grados = null;
        }
        else
        {
            this.m_grados = new ArrayList<GradoRangoSalarial> ( newList );
        }
    }

    /**
     * Nos dice si el {@link GradoRangoSalarial} se encuentra contenido en la
     * lista.
     *
     * @param o {@link GradoRangoSalarial} a buscar.
     *
     * @return <code>true</code> si lo encuentra; <code>false</code> en caso contrario.
     */
    public boolean containsGradoRangoSalarial ( GradoRangoSalarial o )
    {
        return m_grados.contains ( o );
    }


    /**
     * Devuelve el Clave de esta {@link EstructuraSalarial}.
     *
     * @return valor de 'clave'.
     *
     * @see String
     */
    public String getClave ()
    {
        return m_clave;
    }

    /**
     * Establece el Clave de esta {@link EstructuraSalarial}.
     *
     * @param clave nuevo valor para 'clave'.
     *
     * @see String
     */
    public void setClave ( final String clave )
    {
        m_clave = clave;
    }

    /**
     * Devuelve el Descripci&oacute;n de la {@link EstructuraSalarial}.
     *
     * @return valor de 'descripcion'.
     *
     * @see Documento
     */
    public Documento getDescripcion ()
    {
        return m_descripcion;
    }

    /**
     * Establece el Descripci&oacute;n de la {@link EstructuraSalarial}.
     *
     * @param descripcion nuevo valor para 'descripcion'.
     *
     * @see Documento
     */
    public void setDescripcion ( final Documento descripcion )
    {
        m_descripcion = descripcion;
    }


    /**
     * Devuelve el Identificador &uacute;nico de la {@link Estructura} a la que pertenece esta {@link EstructuraSalarial}.
     * @return valor de 'idEstructura'.
     * @see Long
     */
    public Long getIdEstructura ()
    {
        return m_idEstructura;
    }


    /**
     * Establece el Identificador &uacute;nico de la {@link Estructura} a la que pertenece esta {@link EstructuraSalarial}.
     * @param idEstructura nuevo valor para 'idEstructura'.
     * @see Long
     */
    public void setIdEstructura ( final Long idEstructura )
    {
        m_idEstructura = idEstructura;
    }

    /**
     * Convierte este {@link EstructuraSalarial} a su representación textual.
     *
     * @noinspection DuplicateStringLiteralInspection,HardCodedStringLiteral,HardcodedLineSeparator
     */
    public String toString ()
    {
        StringBuilder sb = new StringBuilder ();
        sb.append ( "<Instance Class = '" ).append ( this.getClass ().getCanonicalName () ).append ( "'>" );
        sb.append ( "<clave>" ).append ( m_clave ).append ( "</clave> " );
        sb.append ( "<descripcion>" ).append ( m_descripcion ).append ( "</descripcion> " );
        sb.append ( "<grados>" ).append ( m_grados ).append ( "</grados> " );
        sb.append ( "<idEmpresa>" ).append ( m_idEstructura ).append ( "</idEmpresa> " );
        sb.append ( "</Instance>" );
        return sb.toString ();
    }
}

